# 最小二乘法估计Lokta-Volterra模型的参数

# 创建时间点的取值、捕食者数量和被捕食者数量这三个向量。
import numpy as np
t0=np.array([0,1,2,3,4,5,6,8,10,12,14,16,18])
x0=np.array([60,63,64,63,61,58,53,44,39,38,41,46,53])
y0=np.array([30,34,38,44,50,55,58,56,47,38,30,27,26])

# 进行一些适当的差分运算。
dt=np.diff(t0); dx=np.diff(x0); dy=np.diff(y0)
temp=x0[:-1]*y0[:-1]

# 将一些列向量堆叠成矩阵。
mat1=np.vstack([x0[:-1], -temp, np.zeros((2,12))]).T
mat2=np.vstack([np.zeros((2,12)), -y0[:-1], temp]).T

# 构造线性方程组的系数矩阵与常数项列。
mat=np.vstack([mat1,mat2])
b=np.hstack([dx/dt,dy/dt])

# 用线性最小二乘法拟合参数。
cs=np.linalg.pinv(mat)@b
print('The values of the parameters a,b,c,d are: ', np.round(cs,4))
